#include "app_device.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "pthread.h"
#include "unistd.h"
#include "app_mqtt.h"
#include "app_buffer.h"
#include "log.h"
#include "app_pool.h"
#include "app_message.h"
#include <fcntl.h>
#include "app_common.h"

static app_device_t *app_device;

/**
 * @brief  设备模块下行2的读取线程
 * 1.从缓冲区中读取数据
 * 2.进行数据转换
 * 3.发送到mqtt模块
 */
static void *app_device_up_2_send(void *arg)
{
    // 1.从缓冲区中读取数据
    char read_buf[100] = {0};
    int read_size = app_buffer_read(app_device->up_buffer, read_buf, sizeof(read_buf));
    if (read_size > 0)
    {
        log_info("读取上行缓冲区成功,数据长度:%d", read_size);
        app_common_print_hex(read_buf, read_size);
    }
    else
    {
        log_error("读取上行缓冲区失败");
        return NULL;
    }

    // 2.转换数据
    char *json = app_message_bytes_to_json(read_buf, read_size);
    if (strlen(json) > 0)
    {
        log_info("转换数据成功");
    }

    // 3.发送到mqtt模块
    app_mqtt_publish(json);
    return NULL;
}

/**
 * @brief  设备模块下行2的读取线程
 * 1.从mqtt模块接收数据
 * 2.进行数据转换
 * 3.发送到设备模块
 */
static void *app_device_down_2_write(void *arg)
{
    // 1.从缓冲区中读取数据
    char data_buf[100] = {0};
    int data_size = app_buffer_read(app_device->down_buffer, data_buf, sizeof(data_buf));
    if (data_size > 0)
    {
        log_info("读取下行缓冲区成功,数据长度:%d", data_size);
    }
    // 2.写前预处理
    if (app_device->pre_write != NULL)
    {
        data_size = app_device->pre_write(data_buf, data_size);
        log_info("设备读取数据成功,数据长度:%d", data_size);
        app_common_print_hex(data_buf, data_size);
    }
    // 3.写入到蓝牙模块
    if (data_size > 0)
    {
        log_info("写入设备文件成功");
        app_common_print_hex(data_buf, data_size);
    }
    write(app_device->dev_fd, data_buf, data_size);
    log_info("写入设备文件成功");
    return NULL;
}

/**
 * @brief  设备模块上行1的读取线程
 * 1.设备文件读取数据
 * 2.读后预处理
 * 3.写入到上行缓冲区
 * 4提交到线程池
 */
static void *app_device_up_1_read(void *arg)
{
    // 1.设备文件读取数据
    char read_buf[20] = {0};
    while (1)
    {
        int read_size = read(app_device->dev_fd, read_buf, 20);
        if (read_size < 0)
        {
            log_error("设备文件读取数据失败");
            continue;
        }
        else if (read_size == 0)
        {
            // log_error("设备文件没有数据");
            continue;
        }
        log_info("设备文件读取数据成功,数据长度:%d", read_size);
        app_common_print_hex(read_buf, read_size);
        // 2.读后预处理(蓝牙格式->字节数组)
        if (app_device->post_read != NULL)
        {
            read_size = app_device->post_read(read_buf, read_size);
            log_info("设备文件读取数据成功,数据长度:%d", read_size);
            app_common_print_hex(read_buf, read_size);
        }

        // 3.写入到上行缓冲区
        if (read_size > 0)
        {
            int ret = app_buffer_write(app_device->up_buffer, read_buf, read_size);
            if (ret == 0)
            {
                log_info("写入上行缓冲区成功");
            }

            // 4.提交到线程池
            app_pool_submit_task(app_device_up_2_send, NULL);
            log_info("提交到线程池成功");
        }
    }
    return NULL;
}

/**
 * @brief 设备模块的下行1 通路
 * 1 数据转换  字节数组
   2 写入下行缓冲区
   3 提交后续任务到线程池
 */
static int app_device_down_1_recv(char *json)
{
    log_info("设备模块收到数据:%s", json);
    // 1.数据转换 字节数组
    char buffer[100] = {0};
    int data_size = app_message_json_to_bytes(json, buffer, 100);
    if (data_size > 0)
    {
        log_info("数据转换成功");
    }

    // 2.写入到下行缓冲区
    int ret = app_buffer_write(app_device->down_buffer, buffer, data_size);
    if (ret == 0)
    {
        log_info("写入下行缓冲区成功");
    }
    // 3.提交到线程池
    app_pool_submit_task(app_device_down_2_write, NULL);
    log_info("提交到线程池成功");
    return 0;
}

/**
 * @brief  初始化设备模块
 * @return 设备模块结构体
 */
app_device_t *app_device_init(void)
{
    // 1.创建设备结构体
    app_device = (app_device_t *)malloc(sizeof(app_device_t));
    // 2.打开设备文件
    app_device->dev_filename = DEVICE_FILENAME;
    app_device->dev_fd = open(app_device->dev_filename, O_RDWR);
    if (app_device->dev_fd < 0)
    {
        perror("打开设备文件失败");
        free(app_device);
        return NULL;
    }
    log_info("打开设备文件成功");
    // 3.初始化缓冲区
    app_device->up_buffer = app_buffer_init();
    app_device->down_buffer = app_buffer_init();
    // 4.预处理的初始值NULL
    app_device->post_read = NULL;
    app_device->pre_write = NULL;
    // 5.
    app_device->read_pthread = -1;
    app_device->coon_type = 1;
    // 6.返回设备结构体
    return app_device;
}

/**
 * @brief  设备启动
 * 1.创建读取线程(启动上行通路)
 * 2.向mqtt注册接收数据的回调函数(启动下行通路)
 */
void app_decive_start()
{
    // 1.创建读取线程(启动上行通路)
    pthread_create(&app_device->read_pthread, NULL, app_device_up_1_read, NULL);
    // 2.向mqtt注册接收数据的回调函数(启动下行通路)
    app_mqtt_recv_callback(app_device_down_1_recv);
}

/**
 * @brief  设备销毁
 *
 */
void app_device_destroy(app_device_t *app_device);